// 1- 创建服务
// 2- 创建接口路由
const path = require("path");
const fs = require("fs");
const express = require("express");
const adminList = require("./modules/Db/collections/adminList");
const advList = require("./modules/Db/collections/advList");
const {sendJson, author, uploadImg,cors} = require("./modules/middleware");
const {getNowTime, getMd5, encode} = require("./modules/utils");
const formidable = require("formidable");
const moment = require("moment");
const app = express()
app.use(express.json());// 接收请求体的数据格式
app.use(sendJson());
app.use(uploadImg())
app.use(express.static(path.join(__dirname, "/upload")));
let advTypeEnum = {1: "轮播图广告", 2: "轮播图底部广告", 3: "热门回收广告", 4: "优品精选广告"}
// 添加管理员接口
app.post("/adminList", author(), async (req, res) => {
	
	try {
		// 接收数据
		const {adminName, passWord} = req.body;
		// 判断账号是否有重复的
		const count = await adminList.count({adminName});// 获取满足条件的条数
		if (count === 0) {
			// 没有重复的,添加
			await adminList.insertOne({
				adminName,
				passWord: getMd5(passWord),
				addTime: getNowTime(),
				lastLoginTime: getNowTime()
			})
			res.sendJson("添加管理员成功", 1);
		} else {
			res.sendJson("账号不允许重复");
		}
	} catch (err) {
		console.log("adminList->post", err);
		res.sendJson();
	}
	
	
});
// 获取管理员列表
app.get("/adminList", author(), async (req, res) => {
	try {
		const result = await adminList.find({
			// 按照添加管理员的倒序排列
			sortObj: {
				addTime: -1
			}
		});
		res.json({
			ok: 1,
			msg: "成功",
			adminList: result
		})
	} catch (err) {
		console.log("get->adminList", err);
		res.sendJson();// {ok:-1,msg:"网络连接错误“}
	}
});
// 根据ID删除管理员信息
app.delete("/adminList/:id", author(), async (req, res) => {
	try {
		await adminList.deleteOneById(req.params.id);
		res.sendJson("删除成功", 1);
	} catch (err) {
		console.log("delete->adminList", err);
		res.sendJson();
	}
});
// 登陆
app.post("/login", async (req, res) => {
	// 伪代码：
	// 1- 接收数据（管理员账号，管理员密码）
	// 2- 根据账号以及密码去数据库中查找是否有匹配的文档
	//    2-1 如果有匹配说明登陆成功
	//    2-2 如果无匹配说明登陆失败（账号或密码说明）
	try {
		// 接收数据（管理员账号，管理员密码）
		const {adminName, passWord} = req.body;
		// 根据账号以及密码去数据库中查找是否有匹配的文档
		const count = await adminList.count({adminName, passWord: getMd5(passWord)});
		if (count === 1) {
			// 更新最后登陆的时间
			await adminList.updateOne({adminName}, {lastLoginTime: getNowTime()})
			res.json({
				ok: 1,
				msg: "登陆成功",
				token: encode({adminName})
			})
		} else res.sendJson("登陆失败");
	} catch (err) {
		console.log("post->login", err);
		res.sendJson();
	}
})

// 添加广告
app.post("/advList", (req, res) => {
	res.uploadImg("advPic").then(async params=>{
		if(params.advPic){
			const advType = params.advType[0] / 1;
			const advTitle = params.advTitle[0];
			const advOrder = params.advOrder[0] / 1;
			const advHref = params.advHref[0];
			const advPic = params.advPic;
			await advList.insertOne({
				advTitle,
				advType,
				advOrder,
				advHref,
				addTime: getNowTime(),
				upTime: getNowTime(),
				advPic
			});
			res.json({
				ok: 1,
				msg: "添加成功"
			})
		}else{
			res.sendJson("请选择您要上传的图片");
		}
	}).catch(err=>{
		res.sendJson(err);
	})
	// try {
	// 	// 生成年月日类型的地址
	// 	const datePath = moment().format("YYYY/MM/DD");
	// 	// 存放图片的具体目录
	// 	const uploadDir = path.join(__dirname, "/upload", datePath);
	// 	// 判断目录是否存在，如果不存在，那么创建目录
	// 	if (!fs.existsSync(uploadDir)) {
	// 		fs.mkdirSync(uploadDir, {recursive: true})
	// 	}
	// 	// 生成IncomingForm实例
	// 	const form = new formidable.IncomingForm({
	// 		// 指定接收图片的目录
	// 		uploadDir,
	// 		keepExtensions: true,// 保留扩展名
	// 	});
	// 	// parse接收二个参数：1- 请求对象  2-回调函数
	// 	// 回调函数接收三个参数：
	// 	// err: 异常信息
	// 	// params:接收的是文件以外的所有数据
	// 	// file:接收的是文件数据
	// 	form.parse(req, async function (err, params, file) {
	// 		// let {advType:[advType],advTitle:[advTitle],advOrder:[advOrder],advHref:[advHref]} = params;
	// 		// advType = advType/1;
	// 		// advOrder = advOrder/1;
	// 		try {
	// 			const advType = params.advType[0] / 1;
	// 			const advTitle = params.advTitle[0];
	// 			const advOrder = params.advOrder[0] / 1;
	// 			const advHref = params.advHref[0];
	// 			if (file.advPic) {
	// 				const advPic = file.advPic[0];
	// 				// 获取后缀名
	// 				const extname = path.extname(advPic.filepath);
	// 				const extArr = [".png", ".jpg", ".gif"];
	// 				if (extArr.includes(extname.toLowerCase())) {
	// 					// console.log(advPic)
	// 					await advList.insertOne({
	// 						advTitle,
	// 						advType,
	// 						advOrder,
	// 						advHref,
	// 						addTime: getNowTime(),
	// 						upTime: getNowTime(),
	// 						advPic: datePath + "/" + advPic.newFilename
	// 					});
	// 					res.json({
	// 						ok: 1,
	// 						msg: "添加成功"
	// 					})
	// 				} else {
	// 					fs.unlinkSync(advPic.filepath);
	// 					res.sendJson("请选择正确的图片格式！支持.png,.gif,.jpg")
	// 				}
	//
	// 			} else {
	// 				res.sendJson("请选择您要上传的图片！")
	// 			}
	// 		} catch (err) {
	// 			console.log("post->advList", err);
	// 			res.sendJson();
	// 		}
	//
	//
	// 	})
	//
	// } catch (err) {
	// 	console.log("post->advList", err);
	// 	res.sendJson();
	// }
	
})

// 获取广告列表
app.get("/advList", async (req, res) => {
	let {pageNo = 1, pageSize = 3, keyword = ""} = req.query;
	pageSize = pageSize / 1;
	pageNo = pageNo / 1;
	const whereObj = {};
	// 判断keyword是否有值
	if (keyword.length > 0) {
		whereObj.advTitle = new RegExp(keyword);
	}
	// 获取总条数
	let count = await advList.count(whereObj);
	// 获取总页数
	let pageSum = Math.ceil(count / pageSize);
	if (pageSum === 0) pageSum = 1;
	if (pageNo > pageSum) pageNo = pageSum;
	if (pageNo < 1) pageNo = 1;
	// 获取广告列表
	const result = await advList.find({
		whereObj,// 根据关键词进行搜索
		// 排序:按照advOrder倒序，如果advOrder相同则按照addTime倒序
		sortObj: {
			advOrder: -1,
			addTime: -1
		},
		// 显示的条数
		limit: pageSize,
		// 跳过多少条
		skip: (pageNo - 1) * pageSize
	});
	res.json({
		ok: 1,
		msg: "成功",
		advList: result.map(item => {
			return {
				...item._doc,
				advTypeName: advTypeEnum[item.advType]
			}
		}),
		pageNo,
		pageSum,
		pageSize,
		count
	})
})

// 根据ID删除广告
app.delete("/advList/:id", async (req, res) => {
	const {id} = req.params;
	// 根据ID删除广告信息，并将删除后的广告信息赋值给常量info
	const info = await advList.findByIdAndDelete(id);
	console.log(path.resolve(__dirname, "./upload", info.advPic))
	fs.unlink(path.resolve(__dirname, "./upload", info.advPic), (err) => {
		if (err) {
			res.sendJson("删除失败");
		} else res.sendJson("删除成功", 1);
	})
})
// 根据ID获取广告信息
app.get("/advList/:id", async (req, res) => {
	const {id} = req.params;
	// 根据ID找到广告信息
	const info = await advList.findById(id);
	res.json({
		ok: 1,
		msg: "成功",
		info
	})
})
// 修改广告
app.put("/advList", async (req, res) => {
	res.uploadImg("advPic").then(async params => {
		const id = params.id[0];
		
		const upObj = {
			advTitle: params.advTitle[0],
			advType: params.advType[0],
			advHref: params.advHref[0],
			advOrder: params.advOrder[0],
		}
		// 判断是否提交了图片
		if(params.advPic) {
			upObj.advPic = params.advPic;
		}
		const info = await advList.findByIdAndUpdate(id, upObj);
		// 如果图上有更新，把之前的图片删除掉。
		if(params.advPic){
			fs.unlinkSync(path.resolve(__dirname, "./upload", info.advPic));
		}
		res.sendJson("修改成功", 1);
	}).catch(err => {
		res.sendJson(err);
	});
	
	
	// const datePath = moment().format("YYYY/MM/DD");
	// const uploadDir = path.join(__dirname,"/upload",datePath);
	// if(!fs.existsSync(uploadDir)){
	// 	fs.mkdirSync(uploadDir,{recursive:true});
	// }
	// const form = new formidable.IncomingForm({
	// 	uploadDir,
	// 	keepExtensions:true
	// });
	// form.parse(req,async (err,params,file)=>{
	// 	const id = params.id[0];
	// 	const advTitle = params.advTitle[0];
	// 	const advType = params.advType[0];
	// 	const advHref = params.advHref[0];
	// 	const advOrder = params.advOrder[0];
	// 	const upObj = {
	// 		advTitle,
	// 		advType,
	// 		advHref,
	// 		advOrder,
	// 		upTime:getNowTime()
	// 	}
	// 	// 是否有提交图片
	// 	if(file.advPic){
	// 		// 判断图片类型是否正确
	// 		const advPic = file.advPic[0];
	// 		// 获取后缀名
	// 		const extname = path.extname(advPic.filepath);
	// 		const extArr = [".png", ".jpg", ".gif"];
	// 		if (!extArr.includes(extname.toLowerCase())) {
	// 			fs.unlinkSync(advPic.filepath);
	// 			res.sendJson("请选择正确的图片类型，支持png,jpg,gif");
	// 			return;
	// 		}
	// 		upObj.advPic = datePath + "/" + advPic.newFilename;
	// 	}
	//
	// 	const info = await advList.findByIdAndUpdate(id,upObj);
	// 	// 删除原图片
	// 	fs.unlink(path.resolve(__dirname,"./upload",info.advPic),err=>{
	// 		if(err){
	// 			res.sendJson("修改失败");
	// 		}else res.sendJson("修改成功",1);
	// 	})
	//
	// })
})
app.use(cors());
// 获取广告接口
app.get("/advList/:advType/:limit",async (req,res)=>{
	// advType:广告类型
	// limit:条数
	let advType = req.params.advType/1;
	let limit = req.params.limit/1;
	const result = await advList.find({
		whereObj:{
			advType
		},
		limit
	});
	res.json({
		ok:1,
		advList:result
	})
})
app.listen(9092, () => {
	console.log("success");
})